package sistema.web.dao.impls;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import sistema.web.dao.IPersonaDAO;
import sistema.web.dtos.PersonaDTO;
import sistema.web.dtos.TipoDocumentoDTO;
import sistema.web.utils.MySQLConnection;

public class PersonaDAO implements IPersonaDAO {

	public boolean registrar(String nombre, String apePaterno, String apeMaterno, int tipoDocumento, String nroDocumento, String sexo, String celular, String correo, String contrasena, String direccion) {
		boolean flag = true;
		
		try {
			Connection conn = MySQLConnection.getConnection();
			
			String query = "INSERT INTO persona (Nombres, ApePaterno, ApeMaterno, Sexo, Correo, Password, idTipoDocumento, NroDocumento, Celular, Direccion, FechaCreacion, Estado) VALUES ('" + nombre + "', '" + apePaterno + "', '" + apeMaterno + "', '" + sexo + "', '" + correo + "', '" + contrasena + "', " + tipoDocumento + ", '" + nroDocumento + "', '" + celular + "', '" + direccion + "', curdate(), 1)";
			
			PreparedStatement pst = conn.prepareStatement(query);
			pst.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
			flag = false;
		}
		
		return flag;
	}

	public boolean registrarAdmin(String nombre, String apePaterno, String apeMaterno, int tipoDocumento, String nroDocumento, String sexo, String celular, String correo, String direccion, int idUsuario) {
		boolean flag = true;
		
		try {
			Connection conn = MySQLConnection.getConnection();
			
			String query = "INSERT INTO persona (Nombres, ApePaterno, ApeMaterno, Sexo, Correo, idTipoDocumento, NroDocumento, Celular, Direccion, idUsuarioCreacion, FechaCreacion, Estado) VALUES ('" + nombre + "', '" + apePaterno + "', '" + apeMaterno + "', '" + sexo + "', '" + correo + "', " + tipoDocumento + ", '" + nroDocumento + "', '" + celular + "', '" + direccion + "', " + idUsuario + " , curdate(), 1)";

			PreparedStatement pst = conn.prepareStatement(query);
			pst.executeUpdate();			
			
		} catch (Exception e) {
			e.printStackTrace();
			flag = false;
		}
		
		return flag;
	}

	public boolean actualizarAdmin(int codigo, String nombre, String apePaterno, String apeMaterno, int tipoDocumento, String nroDocumento, String sexo, String celular, String correo, String direccion, int idUsuario) {
		boolean flag = true;
		
		try {
			Connection conn = MySQLConnection.getConnection();
			
			String query = "UPDATE " + 
			"	persona " +
			"SET " +
			"   Nombres = '" + nombre + "', " +
			"   ApePaterno = '" + apePaterno + "', " +
			"   ApeMaterno = '" + apeMaterno + "', " +
			"   Sexo = '" + sexo + "', " +
			"   idTipoDocumento = " + tipoDocumento + ", " +
			"   Correo = '" + correo + "', " +
			"   NroDocumento = '" + nroDocumento + "', " +
			"   Celular = '" + celular + "', " +
			"   Direccion = '" + direccion + "', " +
			"   idUsuarioModificacion = '" + idUsuario + "', " +
			"   FechaModificacion = curdate() " +
			"WHERE " +
			"	idPersona = " + codigo
			;

			PreparedStatement pst = conn.prepareStatement(query);
			pst.executeUpdate();			
			
		} catch (Exception e) {
			e.printStackTrace();
			flag = false;
		}
		
		return flag;
	}
	
	public List<PersonaDTO> listar(String campo, Object valor) {
		List<PersonaDTO> listPersona = null;
		
		try {
			Connection conn = MySQLConnection.getConnection();
			
			String query = 
				"SELECT " + 
				"   * " +
				"FROM " + 
				"	persona per, tipodocumento tip " +
				"WHERE " +
				"	per.idTipoDocumento = tip.idTipoDocumento " +
				"	AND Estado = 1 " 
			;
			
			if(campo != null && valor != null) {
				if(!campo.equals("idPersona")) {
					query += 
						" AND " +
							campo + " like '%" + valor + "%'"
					;					
				} else {
					query += 
						" AND " +
							campo + " = " + valor
					;					
				}			
			}
			
			PreparedStatement pst = conn.prepareStatement(query);
			ResultSet rs = pst.executeQuery();
			listPersona = new ArrayList<PersonaDTO>();
			while(rs.next()) {
				PersonaDTO dtoPersona = new PersonaDTO();
				
				dtoPersona.setIdPersona(rs.getInt("idPersona"));
				dtoPersona.setNombres(rs.getString("Nombres"));
				dtoPersona.setApePaterno(rs.getString("ApePaterno"));
				dtoPersona.setApeMaterno(rs.getString("ApeMaterno"));				
				dtoPersona.setNombresApellidos(dtoPersona.getNombres() + " " + dtoPersona.getApePaterno() + " " + dtoPersona.getApeMaterno());				
				dtoPersona.setSexo(rs.getString("Sexo"));
				dtoPersona.setCorreo(rs.getString("Correo"));
				dtoPersona.setPassword(rs.getString("Password"));
				dtoPersona.setIdTipoDocumento(rs.getInt("idTipoDocumento"));
				dtoPersona.setDescTipoDocumento(rs.getString("Descripcion"));
				dtoPersona.setNroDocumento(rs.getString("NroDocumento"));
				dtoPersona.setCelular(rs.getString("Celular"));
				dtoPersona.setDireccion(rs.getString("Direccion"));
				
				dtoPersona.setIdUsuarioCreacion(rs.getInt("idUsuarioCreacion"));
				dtoPersona.setFechaCreacion(rs.getDate("FechaCreacion"));
				dtoPersona.setIdUsuarioModificacion(rs.getInt("idUsuarioModificacion"));
				dtoPersona.setFechaModificacion(rs.getDate("FechaModificacion"));
				dtoPersona.setEstado(rs.getInt("Estado"));
				
				listPersona.add(dtoPersona);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listPersona;
	}
	
	public PersonaDTO obtenerUsuario(String usuario) {
		PersonaDTO dtoPersona = null;
		
		try {
			Connection conn = MySQLConnection.getConnection();
			
			String query = "SELECT * FROM persona WHERE Correo = '" + usuario + "'";
			
			PreparedStatement pst = conn.prepareStatement(query);
			ResultSet rs = pst.executeQuery();
			if(rs.next()) {
				dtoPersona = new PersonaDTO();
				dtoPersona.setIdPersona(rs.getInt("idPersona"));
				dtoPersona.setNombres(rs.getString("Nombres"));
				dtoPersona.setApePaterno(rs.getString("ApePaterno"));
				dtoPersona.setApeMaterno(rs.getString("ApeMaterno"));
				dtoPersona.setSexo(rs.getString("Sexo"));
				dtoPersona.setCorreo(rs.getString("Correo"));
				dtoPersona.setPassword(rs.getString("Password"));
				dtoPersona.setIdTipoDocumento(rs.getInt("idTipoDocumento"));
				dtoPersona.setNroDocumento(rs.getString("NroDocumento"));
				dtoPersona.setCelular(rs.getString("Celular"));
				dtoPersona.setDireccion(rs.getString("Direccion"));
				dtoPersona.setIdUsuario(rs.getInt("idUsuario"));
				
				dtoPersona.setIdUsuarioCreacion(rs.getInt("idUsuarioCreacion"));
				dtoPersona.setFechaCreacion(rs.getDate("FechaCreacion"));
				dtoPersona.setIdUsuarioModificacion(rs.getInt("idUsuarioModificacion"));
				dtoPersona.setFechaModificacion(rs.getDate("FechaModificacion"));
				dtoPersona.setEstado(rs.getInt("Estado"));
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return dtoPersona;
	}

	public List<TipoDocumentoDTO> obtenerTipoDocumento() {
		List<TipoDocumentoDTO> listTipoDocumento = null;
		
		try {
			Connection conn = MySQLConnection.getConnection();
			
			String query = "SELECT * FROM tipodocumento";
			
			PreparedStatement pst = conn.prepareStatement(query);
			ResultSet rs = pst.executeQuery();
			listTipoDocumento = new ArrayList<TipoDocumentoDTO>();
			while(rs.next()) {
				TipoDocumentoDTO dtoTipoDocumento = new TipoDocumentoDTO();
				
				dtoTipoDocumento.setIdTipoDocumento(rs.getInt("idTipoDocumento"));
				dtoTipoDocumento.setDescripcion(rs.getString("Descripcion"));
				
				listTipoDocumento.add(dtoTipoDocumento);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return listTipoDocumento;
	}

	public boolean eliminar(String codigo) {
		boolean flag = true;
		
		try {
			Connection conn = MySQLConnection.getConnection();
			
			String query = 
				"UPDATE " + 
				"	persona " +
				"SET " +
				"   estado = '0' " +
				"WHERE " +
				"	idPersona = " + codigo
			;
			
			PreparedStatement pst = conn.prepareStatement(query);
			pst.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
			flag = false;
		}
		return flag;
	}
}